在報名後,收到了永豐銀行寄來的"數位金流API技術規格文件",夾檔還附加了 PHP 與 C# 的範例程式。
太好了,因為我準備用 Python 呼叫 API,如果寄來的夾檔是 python 程式碼;
那我第一天就沒法子混過去了。
金融業的API串接,比我想像中還要麻煩些;至少比起我之前串接交通部或是 GCP 服務的API,還要更多程序;
這是法令所規定的,抄錄其中一小段文字如下:
本規格交易安控設計依據「電子銀行業務安全控管作業基準」之規範訂定如下:
➢安全簽章(Sign):為確保交易不可否認生,發動交易請求時需完成訊息內文規則性雜湊及其他參數,在將雜湊後字串用SHA256 Hash產生出來。
➢內文加密機制(Message):本規格採用AES 演算CBC 模式將訊息內文加密,來確保傳送內文之機敏資料不外洩,反之於接收交易回應時,將收到的加密內文以相同規則作解密。
好吧,總之第一個要取得的是 "Nonce" 參數。這還不簡單,用個 Post 方法來取就可以啦;
所以我很開心的用下列的程式碼:
import requests
# ShopNo 由主辦單位提供,此處示例以 xxx 取代
data = {'ShopNo':"xxx"}
URL ="https://apisbx.sinopac.com/funBIZ/QPay.WebAPI/api/Nonce"
r = requests.post(url = URL, data = data)
r.status_code
# 401 !!!
r.text
# "<html><head><title>Request Rejected</title></head><body>The requested URL was rejected. Please consult with your administrator.<br><br>Your support ID is: 7822324514163083814<br><br><a href='javascript:history.back();'>[Go Back]</a></body></html>"
咦! 回應的卻是 "The requested URL was rejected."
到底是發生了什麼事情吧 ?
好吧,趕快偷看一下,PHP的範例程式碼,其中一段是這樣寫的
//取得 Nonce 方法
function getNonce($shopno, $targeturl){
$url = $targeturl . "/Nonce";
$post_data = json_encode(array('ShopNo' => $shopno));
$result = WebAPI($url, $post_data);
$result = json_decode($result);
return $result->Nonce;
}
看到幾個關鍵字 json 、 encode 然後才是送出 POST。
因為平常使用 requests.post 時,都是利過 data 參數進行資料的傳送;
趕快查一下 requests.post 還支援了什麼參數。果然真的有支援 json 的參數,因為平常沒有使用,所以真的不知道有什麼用法。所以將上面的程式改成如下
import requests
# ShopNo 由主辦單位提供,此處示例以 xxx 取代
json = {'ShopNo':"xxx"}
URL ="https://apisbx.sinopac.com/funBIZ/QPay.WebAPI/api/Nonce"
r = requests.post(url = URL, json = json )
r.status_code
# 200
r.text
# 成功! '{"Nonce":"yyyyy"}'
r.json()
# 成功!'{"Nonce":"yyyyy"}'
所以還好有 PHP 的範例程式碼,我可以大致推斷自己錯誤的狀況…
總之,第一天就先這樣吧 :)